import { toLatLng } from "../geometry/LatLng";
import { toPoint } from "../geometry/Point";

export default class ProjectMercator {
  name = "EPSG3857";
  // 地球半径
  EARTH_RAD = 6378137;
  constructor() {}

  // 角度转弧度
  angleToRad = (angle) => {
    return angle * (Math.PI / 180);
  };

  // 弧度转角度
  radToAngle = (rad) => {
    return rad * (180 / Math.PI);
  };
  project(latlng) {
    // 经度先转弧度，然后因为 弧度 = 弧长 / 半径 ，得到弧长为 弧长 = 弧度 * 半径
    let x = this.angleToRad(latlng.lng) * this.EARTH_RAD;
    // 纬度先转弧度
    let rad = this.angleToRad(latlng.lat);
    // 下面我就看不懂了，各位随意。。。
    let sin = Math.sin(rad);
    let y = (this.EARTH_RAD / 2) * Math.log((1 + sin) / (1 - sin));
    return toPoint(x, y);
  }

  // 后边这个方法要删除
  lngLatToMercator = (lng, lat) => {
    // 经度先转弧度，然后因为 弧度 = 弧长 / 半径 ，得到弧长为 弧长 = 弧度 * 半径
    let x = this.angleToRad(lng) * this.EARTH_RAD;
    // 纬度先转弧度
    let rad = this.angleToRad(lat);
    // 下面我就看不懂了，各位随意。。。
    let sin = Math.sin(rad);
    let y = (this.EARTH_RAD / 2) * Math.log((1 + sin) / (1 - sin));
    return toLatLng(x, y);
  };
  unproject(point) {
    let lng = this.radToAngle(point.x) / this.EARTH_RAD;
    let lat = this.radToAngle(
      2 * Math.atan(Math.exp(point.y / this.EARTH_RAD)) - Math.PI / 2
    );
    return toLatLng(lng, lat);
  }
}

export const projectMercator = () => {
  return new ProjectMercator();
};
